package com.jt.resource.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Slf4j
@Aspect
@Component
public class      LogAspect {
    @Pointcut("@annotation(com.jt.resource.annotation.RequiredLog)")
    public void doLog(){
        //方法内部不写任何内容，这个方法主要是为了承载切入点的定义
    }

    //@Around("@annotation(com.jt.resource.annotation.RequiredLog)")
    @Around("doLog()")
    public Object doAround(ProceedingJoinPoint joinPoint)
            throws Throwable{
        int status=1;//状态,初始值为1
        long time=0;//耗时，默认值为0
        String error="";
        //1.获取方法开始执行的时间，并输出
        long t1=System.currentTimeMillis();
        log.debug("before.time {}",t1);
        try {
            //2.调用目标执行链，这个执行链的终点是你的切入点方法
            //执行结果为切入点方法的执行结果
            Object result = joinPoint.proceed();
            //3.获取方法执行结束的数据，并输出。
            long t2 = System.currentTimeMillis();
            log.debug("after.time {}", t2);
            time=t2-t1;
            return result;
        }catch (Throwable e){
            long t3 = System.currentTimeMillis();
            log.error("exception.time {}", t3);
            time=t3-t1;
            status=0;
            error=e.getMessage();
            throw e;
        }finally{
            //saveUserLog(time,status,error);//这里的保存是将日志最后传递给system工程
        }

    }
    private void saveUserLog(Long time,int status,String error){
        //1.获取用户行为日志
        //2.封装用户行为日志
        //3.持久化用户行为日志
    }

}






